/**
 * 通用工具类
 */
export default class Func {
  /**
   * 不为空
   * @param val 任意值
   * @returns {boolean} 是否不为空
   */
  static notEmpty(val : unknown) : boolean {
    return !this.isEmpty(val);
  }

  /**
   * 是否为 undefined 或 null
   * @param val 任意值
   * @returns {boolean} 是否为 undefined 或 null
   */
  static isUndefined(val : unknown) : boolean {
    return val === undefined || val === null;
  }

  /**
   * 为空判断（包括空字符串）
   * @param val 任意值
   * @returns {boolean} 是否为空
   */
  static isEmpty(val : unknown) : boolean {
    if (val === undefined || val === null) {
      return true;
    }
    if (typeof val === 'string' && val.trim() === '') {
      return true;
    }
    if (Array.isArray(val) && val.length === 0) {
      return true;
    }
    if (typeof val === 'object' && Object.keys(val as object).length === 0) {
      return true;
    }
    return false;
  }

  /**
   * 强转 int 型
   * @param val 输入值
   * @param defaultValue 默认值（可选）
   * @returns {number} 转换后的整数
   */
  static toInt(val : unknown, defaultValue : number = -1) : number {
    if (this.isEmpty(val)) {
      return defaultValue;
    }
    const num = parseInt(val as string, 10);
    return Number.isNaN(num) ? defaultValue : num;
  }

  /**
   * Json 强转为 FormData
   * @param obj 普通对象
   * @returns {FormData} 转换后的 FormData
   */
  static toFormData(obj : Record<string, any>) : FormData {
    const data = new FormData();
    Object.keys(obj).forEach((key) => {
      const value = obj[key];
      data.append(
        key,
        Array.isArray(value) ? value.join(',') : value
      );
    });
    return data;
  }

  /**
   * Date 对象格式化为字符串
   * @param date Date 对象
   * @param format 格式字符串（默认：'YYYY-MM-DD HH:mm:ss'）
   * @returns {string | null} 格式化后的字符串
   */
  static format(date : Date | null, format : string = 'YYYY-MM-DD HH:mm:ss') : string | null {
    if (!date) return null;

    // 注意：这里假设 date 对象有 format 方法（如使用 moment.js 或 day.js）
    // 如果是原生 Date 对象，需要实现格式化逻辑或使用库
    if (typeof date.format === 'function') {
      return date.format(format);
    }

    // 简单的原生 Date 格式化示例（可根据需要扩展）
    const pad = (n : number) => n.toString().padStart(2, '0');
    return format
      .replace('YYYY', date.getFullYear().toString())
      .replace('MM', pad(date.getMonth() + 1))
      .replace('DD', pad(date.getDate()))
      .replace('HH', pad(date.getHours()))
      .replace('mm', pad(date.getMinutes()))
      .replace('ss', pad(date.getSeconds()));
  }

  /**
   * 数组用逗号连接为字符串
   * @param arr 任意类型的数组
   * @returns {string} 连接后的字符串
   */
  static join<T>(arr : T[] | null | undefined) : string {
    return Array.isArray(arr) ? arr.join(',') : '';
  }

  /**
   * 字符串用逗号分隔为数组
   * @param str 输入字符串
   * @returns {string[]} 分割后的数组
   */
  static split(str : string | null | undefined) : string[] {
    return typeof str === 'string' ? str.split(',') : [];
  }
  /**
   * 获取当前北京时间
   */
  static getBeijingTimeISOString() {
    const date = new Date();
    const utcTime = date.getTime();
    const beijingTime = new Date(utcTime + 8 * 60 * 60 * 1000); // UTC+8

    // 格式化各部分
    const year = beijingTime.getUTCFullYear();
    const month = String(beijingTime.getUTCMonth() + 1).padStart(2, '0');
    const day = String(beijingTime.getUTCDate()).padStart(2, '0');
    const hour = String(beijingTime.getUTCHours()).padStart(2, '0');
    const minute = String(beijingTime.getUTCMinutes()).padStart(2, '0');
    const second = String(beijingTime.getUTCSeconds()).padStart(2, '0');
    return `${year}-${month}-${day} ${hour}:${minute}:${second}`;
  }


}
